package com.apci.ipreda.client.web.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.AbstractMultiActionFormController;

import com.apci.ipreda.client.web.form.DeclaracionForm;
import com.apci.ipreda.domain.Actividad;
import com.apci.ipreda.domain.Declaracion;
import com.apci.ipreda.domain.Departamento;
import com.apci.ipreda.domain.Distrito;
import com.apci.ipreda.domain.Donacion;
import com.apci.ipreda.domain.Empleado;
import com.apci.ipreda.domain.Empresa;
import com.apci.ipreda.domain.Entidad;
import com.apci.ipreda.domain.EstadoDeclaracion;
import com.apci.ipreda.domain.Pais;
import com.apci.ipreda.domain.Provincia;
import com.apci.ipreda.domain.Resolucion;
import com.apci.ipreda.domain.SituacionDeclaracion;
import com.apci.ipreda.domain.TipoDataBase;
import com.apci.ipreda.domain.TipoEntidad;
import com.apci.ipreda.domain.TipoResolucion;
import com.apci.ipreda.service.ActividadService;
import com.apci.ipreda.service.DeclaracionService;
import com.apci.ipreda.service.DonacionService;
import com.apci.ipreda.service.EmpleadoService;
import com.apci.ipreda.service.EmpresaService;
import com.apci.ipreda.service.EntidadDireccionService;
import com.apci.ipreda.service.EntidadService;
import com.apci.ipreda.service.ResolucionService;
import com.apci.ipreda.service.TipoDataBaseService;
import com.apci.ipreda.util.CommonUtil;

public class DeclaracionEditController extends AbstractMultiActionFormController {
	
	private EntidadService entidadService;
	private EntidadDireccionService entidadDireccionService;
	private TipoDataBaseService tipoDataBaseService;
	private EmpleadoService empleadoService;
	private ResolucionService resolucionService;
	private DeclaracionService declaracionService;
	private DonacionService donacionService;
	private EmpresaService empresaService;
	private ActividadService actividadService;
	private static String DEFAULT_DATE = "01/01/2000"; 
	
	public void setEntidadService(EntidadService entidadService) {
		this.entidadService = entidadService;
	}
	
	public ModelAndView nuevaDeclaracion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception  {
		logger.info("nuevo");
		Long entidadId = (Long) request.getSession().getAttribute("entidadId");
		Entidad entidad = entidadService.getEntidadById(entidadId);
		EstadoDeclaracion estadoDeclaracion = tipoDataBaseService.getEstadoDeclaracionByCodigo(EstadoDeclaracion.CODE_ESTADO_ABIERTO);
		SituacionDeclaracion situacionDeclaracion = tipoDataBaseService.getSituacionDeclaracionByCodigo(SituacionDeclaracion.CODE_SITUACION_PENDIENTE);
		declaracionForm.getDeclaracion().setEstadoDeclaracion(estadoDeclaracion);
		declaracionForm.getDeclaracion().setSituacionDeclaracion(situacionDeclaracion);
		declaracionForm.getDeclaracion().setEntidad(entidad);
		declaracionForm.getDeclaracion().setFechaElaboracion(new Date());
		logger.info("----------------------------------------------------------------------------------");
		
		Declaracion declaracion= declaracionService.getDeclaracionByEntidadYPeriodo(entidadId, declaracionForm.getDeclaracion().getPeriodo());
		logger.info("----------------------------------------------------------------------------------");
		if(declaracion==null){
			declaracionService.saveDeclaracion(declaracionForm.getDeclaracion());
			declaracion = declaracionForm.getDeclaracion();
		}
		
		if(!CollectionUtils.isEmpty(entidad.getEntidadDireccionList())){
			declaracionForm.setEntidadDireccion(entidad.getEntidadDireccionList().get(0));
			if(declaracionForm.getEntidadDireccion().getPais()==null){
				declaracionForm.getEntidadDireccion().setPais(new Pais());
			}
			if(declaracionForm.getEntidadDireccion().getDepartamento()==null){
				declaracionForm.getEntidadDireccion().setDepartamento(new Departamento());
			}
			if(declaracionForm.getEntidadDireccion().getProvincia()==null){
				declaracionForm.getEntidadDireccion().setProvincia(new Provincia());
			}
			if(declaracionForm.getEntidadDireccion().getDistrito()==null){
				declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
			}
		}
		Actividad actividad = new Actividad();
		declaracionForm.setActividad(actividad);

		//Declaracion declaracion = declaracionService.getDeclaracionByEntidadYPeriodo(entidadId, declaracionForm.getDeclaracion().getPeriodo());
		declaracionForm.setDeclaracion(declaracion);
		
		return showForm(request, errors, "secure/formatoGeneral");
		//String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		//return showForm(request, errors, url);
	}
	
	public ModelAndView editarDeclaracion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		
		Declaracion declaracion = declaracionService.getDeclaracionById(declaracionForm.getDeclaracion().getId());
		declaracionForm.setDeclaracion(declaracion);
		Entidad entidad = declaracion.getEntidad();
		if(!CollectionUtils.isEmpty(entidad.getEntidadDireccionList())){
			declaracionForm.setEntidadDireccion(entidad.getEntidadDireccionList().get(0));
			if(declaracionForm.getEntidadDireccion().getPais()==null){
				declaracionForm.getEntidadDireccion().setPais(new Pais());
			}
			if(declaracionForm.getEntidadDireccion().getDepartamento()==null){
				declaracionForm.getEntidadDireccion().setDepartamento(new Departamento());
			}
			if(declaracionForm.getEntidadDireccion().getProvincia()==null){
				declaracionForm.getEntidadDireccion().setProvincia(new Provincia());
			}
			if(declaracionForm.getEntidadDireccion().getDistrito()==null){
				declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
			}
		}
		
		if (declaracion.getDonacionList() != null && declaracion.getDonacionList().size() > 0) {
			Long donacionId = declaracion.getDonacionList().get(declaracion.getDonacionList().size() - 1).getId();
			Donacion donacion = donacionService.getDonacionById(donacionId);
			
			List<Empresa> empresaList = donacion.getEmpresaList();
			if(empresaList.size()==1){
				empresaList.add(new Empresa());
			}
			Empresa[] arrEmpresa = empresaList.toArray(new Empresa[0]);
			declaracionForm.setArrEmpresa(arrEmpresa );
			
			List<Resolucion> resolucionList = donacion.getResolucionList();
			List<Resolucion> resolucionListTemp = new ArrayList<Resolucion>();
			if(!CollectionUtils.isEmpty(resolucionList)){
				Resolucion resolucionTemp = resolucionList.get(0);
				if(resolucionTemp.getTipoResolucion().getCodigo().equals(TipoResolucion.CODE_RESO_APRO)){
					resolucionListTemp.add(resolucionList.get(0));
					resolucionListTemp.add(new Resolucion());
				}else{
					resolucionListTemp.add(new Resolucion());
					resolucionListTemp.add(resolucionList.get(0));
				}
			}
			Resolucion[] arrResolucion = resolucionListTemp.toArray(new Resolucion[0]);
			declaracionForm.setArrResolucion(arrResolucion );
			
		}
		
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	
	public ModelAndView eliminarDeclaracion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		declaracionService.deleteDeclaracion(declaracionForm.getDeclaracion().getId());
		return showForm(request, errors, "secure/redirect");	
	}
	
	public ModelAndView guardarDeclaracion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		
		System.out.println("guardarDeclaracion");
		Declaracion declaracion = declaracionForm.getDeclaracion();
		Entidad entidad = entidadService.getEntidadById(declaracion.getEntidad().getId());
	
		entidad.setDenominacion(declaracionForm.getDeclaracion().getEntidad().getDenominacion());
		entidad.setSigla(declaracionForm.getDeclaracion().getEntidad().getSigla());
		entidad.setRuc(declaracionForm.getDeclaracion().getEntidad().getRuc());
		entidad.setTipoEntidad(declaracionForm.getDeclaracion().getEntidad().getTipoEntidad());
		
		entidadService.save(entidad);
		Declaracion declaracionTemp = declaracionService.getDeclaracionById(declaracion.getId());
		declaracionTemp.setObservacion(declaracion.getObservacion());
		declaracionService.saveDeclaracion(declaracionTemp);
		declaracionForm.getEntidadDireccion().setEntidad(declaracion.getEntidad());
		if(declaracionForm.getEntidadDireccion().getId()==null){
			entidadDireccionService.save(declaracionForm.getEntidadDireccion());
		}else{
			entidadDireccionService.update(declaracionForm.getEntidadDireccion());
		}
		declaracionForm.getDeclaracion().setEntidad(entidad);
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);
	}
	
	public ModelAndView entidadCambiaUbigeo(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		
		System.out.println("entidadCambiaUbigeo");
		
		if(Departamento.TIPO.equals(declaracionForm.getEntidadCambiaUbigeo())){
			declaracionForm.getEntidadDireccion().setProvincia(new Provincia());
			declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
		}
		if(Provincia.TIPO.equals(declaracionForm.getEntidadCambiaUbigeo())){
			declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
		}
		
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	public ModelAndView agregarEmpleado(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("agregarEmpleado");
		
		Empleado empleado = declaracionForm.getEmpleado();
		empleado.setEntidad(declaracionForm.getDeclaracion().getEntidad());
		if(empleado.getId()!=null){
			empleadoService.update(empleado);
		}else{
			empleadoService.saveEmpleado(empleado);
		}
		declaracionForm.setEmpleado(new Empleado());

		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);
	}
	public ModelAndView editarEmpleado(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("editar empleado");
		Long empleadoId = declaracionForm.getEmpleado().getId();
		
		Empleado empleado = empleadoService.getEmpleadoById(empleadoId);
		declaracionForm.setEmpleado(empleado);
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	public ModelAndView eliminarEmpleado(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("eliminar empleado");
		Long empleadoId = declaracionForm.getEmpleado().getId();
		
		Empleado empleado = empleadoService.getEmpleadoById(empleadoId);
		empleadoService.delete(empleado);
		declaracionForm.setEmpleado(new Empleado());
		
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);
	}
	public ModelAndView agregarDonacion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("agregarDonacion");
		
		Donacion donacion = declaracionForm.getDonacion();
		
		if(CommonUtil.getDateFormatted(donacion.getFechaRecepcion(), null).equals(DEFAULT_DATE)){
			donacion.setFechaRecepcion(null);
		}
		donacion.setDeclaracion(declaracionForm.getDeclaracion());
		if(donacion.getId()!=null){
			Donacion donacion2 = donacionService.getDonacionById(donacion.getId());
			donacion.setEmpresaList(donacion2.getEmpresaList());
			donacion.setResolucionList(donacion2.getResolucionList());
			donacionService.update(donacion);
		}else{
			donacionService.saveDonacion(donacion);
		}
		
		Empresa[] arrDonacion= declaracionForm.getArrEmpresa();
		Resolucion[] arrResolucion= declaracionForm.getArrResolucion();
		List<Empresa> empresaList = Arrays.asList(arrDonacion);
		List<Resolucion> resolucionLis = Arrays.asList(arrResolucion);
		for (Empresa empresa : empresaList) {
			logger.info(empresa.getDenominacion());
			logger.info(empresa.getPais().getId());
			if(empresa.getDenominacion()!=null){
				empresa.setDonacion(donacion);
				if(empresa.getId()==null){
					empresaService.saveEmpresa(empresa);
				}else{
					empresaService.update(empresa);
				}
			}
		}
		for (Resolucion resolucion : resolucionLis) {
			logger.info(resolucion.getTipoResolucion());
			logger.info(resolucion.getNumero());
			logger.info(resolucion.getFecha());
			logger.info(resolucion.getObservacion());
			if(resolucion.getTipoResolucion()!=null && resolucion.getTipoResolucion().getCodigo()!=null){
				resolucion.setDonacion(donacion);
				
				if(CommonUtil.getDateFormatted(resolucion.getFecha(), null).equals(DEFAULT_DATE)){
					resolucion.setFecha(null);
				}
				if(resolucion.getId()==null){
					resolucionService.saveResolucion(resolucion);
				}else{
					resolucionService.update(resolucion);
				}
			}
		}
		
			Donacion donacionRES = donacionService.getDonacionById(donacion.getId());
			
			empresaList = donacionRES.getEmpresaList();
			if(empresaList.size()==1){
				empresaList.add(new Empresa());
			}
			Empresa[] arrEmpresa = empresaList.toArray(new Empresa[0]);
			declaracionForm.setArrEmpresa(arrEmpresa );
			
			List<Resolucion> resolucionList = donacionRES.getResolucionList();
			List<Resolucion> resolucionListTemp = new ArrayList<Resolucion>();
			if(!CollectionUtils.isEmpty(resolucionList)){
				Resolucion resolucionTemp = resolucionList.get(0);
				if(resolucionTemp.getTipoResolucion().getCodigo().equals(TipoResolucion.CODE_RESO_APRO)){
					resolucionListTemp.add(resolucionList.get(0));
					resolucionListTemp.add(new Resolucion());
				}else{
					resolucionListTemp.add(new Resolucion());
					resolucionListTemp.add(resolucionList.get(0));
				}
			}
			arrResolucion = resolucionListTemp.toArray(new Resolucion[0]);
			declaracionForm.setArrResolucion(arrResolucion);
			
		
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		
		return showForm(request, errors, url);	
	}
	public ModelAndView editarDonacion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("editarDonacion");
		Long donacionId = declaracionForm.getDonacion().getId();
		
		Donacion donacion = donacionService.getDonacionById(donacionId);
		declaracionForm.setDonacion(donacion);
		
		List<Empresa> empresaList = donacion.getEmpresaList();
		if(empresaList.size()==1){
			empresaList.add(new Empresa());
		}
		Empresa[] arrEmpresa = empresaList.toArray(new Empresa[0]);
		declaracionForm.setArrEmpresa(arrEmpresa );
		
		List<Resolucion> resolucionList = donacion.getResolucionList();
		List<Resolucion> resolucionListTemp = new ArrayList<Resolucion>();
		if(!CollectionUtils.isEmpty(resolucionList)){
			Resolucion resolucionTemp = resolucionList.get(0);
			if(resolucionTemp.getTipoResolucion().getCodigo().equals(TipoResolucion.CODE_RESO_APRO)){
				resolucionListTemp.add(resolucionList.get(0));
				resolucionListTemp.add(new Resolucion());
			}else{
				resolucionListTemp.add(new Resolucion());
				resolucionListTemp.add(resolucionList.get(0));
			}
		}
		Resolucion[] arrResolucion = resolucionListTemp.toArray(new Resolucion[0]);
		declaracionForm.setArrResolucion(arrResolucion );
		
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	public ModelAndView eliminarDonacion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("eliminarDonacion");
		Long donacionId = declaracionForm.getDonacion().getId();
		Donacion donacion = donacionService.getDonacionById(donacionId);
		
		try{
			donacionService.delete(donacion);
		}catch(org.hibernate.exception.ConstraintViolationException e){
			errors.rejectValue("donacion.id", "error.donacion.id", "INFORMACION DE MERCANCIAS DONADAS: No se puede eliminar una donacion que esta relacionada a una actividad");
		}catch(org.springframework.dao.DataIntegrityViolationException e){
			errors.rejectValue("donacion.id", "error.donacion.id", "INFORMACION DE MERCANCIAS DONADAS: No se puede eliminar una donacion que esta relacionada a una actividad");
		}
		declaracionForm.setDonacion(new Donacion());
		declaracionForm.setArrEmpresa(null);
		declaracionForm.setArrResolucion(null);
		
		
		if(errors.hasErrors()){
			return showForm(request, errors,"secure/formatoGeneral");
		}
				
		
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);	
	}
	
	public ModelAndView agregarActividad(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("agregarActividad");
		
		Actividad actividad = declaracionForm.getActividad();
		
		if(CommonUtil.getDateFormatted(actividad.getFechaEntrega(), null).equals(DEFAULT_DATE)){
			actividad.setFechaEntrega(null);
		}
		if(CommonUtil.getDateFormatted(actividad.getFechaFin(), null).equals(DEFAULT_DATE)){
			actividad.setFechaFin(null);
		}
		if(CommonUtil.getDateFormatted(actividad.getFechaInicio(), null).equals(DEFAULT_DATE)){
			actividad.setFechaInicio(null);
		}
		
		actividad.setDeclaracion(declaracionForm.getDeclaracion());
		if(actividad.getId()==null){
			try{
				actividadService.saveActividad(actividad);
			}catch(Exception e){
				e.printStackTrace();
			}
		}else{
			actividadService.update(actividad);
		}		
		
		declaracionForm.setActividad(new Actividad());
		/**/
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);	
	}
	public ModelAndView editarActividad(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("editarActividad");
		
		Long actividadId = declaracionForm.getActividad().getId();
		
		Actividad actividad = actividadService.getActividadById(actividadId);
		declaracionForm.setActividad(actividad);
		
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	public ModelAndView eliminarActividad(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		System.out.println("eliminarActividad");
		
		Long actividadId = declaracionForm.getActividad().getId();
		Actividad actividad = actividadService.getActividadById(actividadId);
		actividadService.delete(actividad);
		
		String url ="redirect:declaracionEdit.html?declaracionId="+declaracionForm.getDeclaracion().getId()+"&activeTab="+declaracionForm.getActiveTab();
		return showForm(request, errors, url);	
	}
	public ModelAndView actividadCambiaUbigeo(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		
		System.out.println("entidadCambiaUbigeo");
		
		if(Departamento.TIPO.equals(declaracionForm.getEntidadCambiaUbigeo())){
			declaracionForm.getActividad().setProvincia(new Provincia());
			declaracionForm.getActividad().setDistrito(new Distrito());
		}
		if(Provincia.TIPO.equals(declaracionForm.getEntidadCambiaUbigeo())){
			declaracionForm.getActividad().setDistrito(new Distrito());
		}
		
		return showForm(request, errors, "secure/formatoGeneral");	
	}
	public ModelAndView finalizarDeclaracion(HttpServletRequest request, 
            HttpServletResponse response, DeclaracionForm declaracionForm, BindException errors) throws Exception {
		
		declaracionForm.getDeclaracion().setFechaFinalizacion(new Date());
		EstadoDeclaracion estadoDeclaracion = tipoDataBaseService.getEstadoDeclaracionByCodigo(EstadoDeclaracion.CODE_ESTADO_CERRADO);
		SituacionDeclaracion situacionDeclaracion = tipoDataBaseService.getSituacionDeclaracionByCodigo(SituacionDeclaracion.CODE_SITUACION_FINALIZADO);
		declaracionForm.getDeclaracion().setEstadoDeclaracion(estadoDeclaracion);
		declaracionForm.getDeclaracion().setSituacionDeclaracion(situacionDeclaracion);
		declaracionService.saveDeclaracion(declaracionForm.getDeclaracion()); 
		
		return showForm(request, errors, "redirect:declaracion.html");	
	}
	
	
	protected Object formBackingObject(HttpServletRequest request)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("formBackingObject");
		
		if(!isFormSubmission(request)){
			DeclaracionForm declaracionForm = new DeclaracionForm();
			String declaracionId = request.getParameter("declaracionId");
			String activeTab = request.getParameter("activeTab");
			Declaracion declaracion= declaracionService.getDeclaracionById( Long.parseLong(declaracionId));
			declaracionForm.setDeclaracion(declaracion);
			declaracionForm.setActiveTab(activeTab);
			Entidad entidad = declaracion.getEntidad();
			if(!CollectionUtils.isEmpty(entidad.getEntidadDireccionList())){
				declaracionForm.setEntidadDireccion(entidad.getEntidadDireccionList().get(0));
				if(declaracionForm.getEntidadDireccion().getPais()==null){
					declaracionForm.getEntidadDireccion().setPais(new Pais());
				}
				if(declaracionForm.getEntidadDireccion().getDepartamento()==null){
					declaracionForm.getEntidadDireccion().setDepartamento(new Departamento());
				}
				if(declaracionForm.getEntidadDireccion().getProvincia()==null){
					declaracionForm.getEntidadDireccion().setProvincia(new Provincia());
				}
				if(declaracionForm.getEntidadDireccion().getDistrito()==null){
					declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
				}
			}
			return declaracionForm;
		}
		return super.formBackingObject(request);
	}
	
	
	protected ModelAndView showForm(HttpServletRequest paramHttpServletRequest,
			HttpServletResponse paramHttpServletResponse,
			BindException paramBindException) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Show form");
		
		return showForm(paramHttpServletRequest, paramBindException, "secure/formatoGeneral"); 
	}
	
	
	public Map referenceData(HttpServletRequest request, Object command, Errors errors) throws Exception {
		System.out.println("---------------------referenceData-----------------");
		Map<String, Object> referenceData = new HashMap<String, Object>();
		DeclaracionForm declaracionForm = (DeclaracionForm)command;
		
		/*listas*/
		if(errors.hasErrors()){
			declaracionForm.setHasErrors(true);
		}else{
			declaracionForm.setHasErrors(false);
		}
		
		List<Donacion> donacionList = donacionService.getDonacionList(declaracionForm.getDeclaracion().getId());
		declaracionForm.getDeclaracion().setDonacionList(donacionList);
		
		declaracionForm.getDeclaracion().getEntidad().setEmpleadoList(empleadoService.getEmpleadoListByEntidadId(declaracionForm.getDeclaracion().getEntidad().getId()));
		
		List<Actividad> actividadList = actividadService.getActividadListByDeclaracionId(declaracionForm.getDeclaracion().getId());
		declaracionForm.getDeclaracion().setActividadList(actividadList);
		/**/
		/*informacion ipreda*/
		Entidad entidad = declaracionForm.getDeclaracion().getEntidad();
		if(entidad.getTipoEntidad()==null){
			entidad.setTipoEntidad(new TipoEntidad());
		}
		entidad.setTipoEntidadList(tipoDataBaseService.getTipoEntidadList());
		declaracionForm.getEntidadDireccion().setPaisList(tipoDataBaseService.getPaisList());
		TipoDataBase tipoDataBase = null;
		
		tipoDataBase = tipoDataBaseService.getTipoDataBaseListByCodigo(Pais.CODE_PAIS_PERU);
		
		List<Departamento> departamentoList = tipoDataBaseService.getDepartamentoListByCodigoPadre(tipoDataBase.getCodigo());
		declaracionForm.getEntidadDireccion().setDepartamentoList(departamentoList);
		if(declaracionForm.getEntidadDireccion().getDepartamento()==null || declaracionForm.getEntidadDireccion().getDepartamento().getCodigo()==null){
			if(!CollectionUtils.isEmpty(departamentoList)){
				Departamento departamentoTemp = departamentoList.get(0);
				declaracionForm.getEntidadDireccion().setDepartamento(departamentoTemp);
			}
		}
		if(declaracionForm.getEntidadDireccion().getDepartamento()!=null && declaracionForm.getEntidadDireccion().getDepartamento().getCodigo()!=null){
			tipoDataBase = tipoDataBaseService.getTipoDataBaseById(declaracionForm.getEntidadDireccion().getDepartamento().getCodigo());
			List<Provincia> provinciaList = tipoDataBaseService.getProvinciaListByCodigoPadre(tipoDataBase.getCodigo());
			declaracionForm.getEntidadDireccion().setProvinciaList(provinciaList);
			if(!CollectionUtils.isEmpty(provinciaList) && (declaracionForm.getEntidadDireccion().getProvincia()==null || declaracionForm.getEntidadDireccion().getProvincia().getCodigo()==null)){
				Provincia provinciaTemp = provinciaList.get(0);
				declaracionForm.getEntidadDireccion().setProvincia(provinciaTemp);
			}
		}else{
			declaracionForm.getEntidadDireccion().setProvincia(new Provincia());
			declaracionForm.getEntidadDireccion().setProvinciaList(new ArrayList<Provincia>());
		}
		if(declaracionForm.getEntidadDireccion().getProvincia()!=null && declaracionForm.getEntidadDireccion().getProvincia().getCodigo()!=null){
			tipoDataBase = tipoDataBaseService.getTipoDataBaseById(declaracionForm.getEntidadDireccion().getProvincia().getCodigo());
			List<Distrito> distritoList = tipoDataBaseService.getDistritoListByCodigoPadre(tipoDataBase.getCodigo());
			declaracionForm.getEntidadDireccion().setDistritoList(distritoList);
			if(!CollectionUtils.isEmpty(distritoList) && (declaracionForm.getEntidadDireccion().getDistrito()==null || declaracionForm.getEntidadDireccion().getDistrito().getCodigo()==null)){
				Distrito distritoTemp = distritoList.get(0);
				declaracionForm.getEntidadDireccion().setDistrito(distritoTemp);
			}
		}else{
			declaracionForm.getEntidadDireccion().setDistrito(new Distrito());
			declaracionForm.getEntidadDireccion().setDistritoList(new ArrayList<Distrito>());
		}
		declaracionForm.getDeclaracion().setEntidad(entidad);
		
		if(declaracionForm.getEmpleado().getId()!=null){
			declaracionForm.setEmpleado(empleadoService.getEmpleadoById(declaracionForm.getEmpleado().getId()));
		}
		declaracionForm.getEmpleado().setCargoEmpleadoList(tipoDataBaseService.getCargoEmpleadoList());
		declaracionForm.getEmpleado().setTipoDocumentoIdentidadList(tipoDataBaseService.getTipoDocumentoIdentidadList());
		
		/*actividad*/
		
		if(!CollectionUtils.isEmpty(donacionList)){
			Donacion[] arrDonacion = donacionList.toArray(new Donacion[0]);
			declaracionForm.getActividad().setResolucionList(resolucionService.getResolucionListByArrDonacion(arrDonacion));
		}
		tipoDataBase = tipoDataBaseService.getTipoDataBaseListByCodigo(Pais.CODE_PAIS_PERU);
		departamentoList = tipoDataBaseService.getDepartamentoListByCodigoPadre(tipoDataBase.getCodigo());
		declaracionForm.getActividad().setDepartamentoList(departamentoList);
		if(declaracionForm.getActividad().getDepartamento()==null || declaracionForm.getActividad().getDepartamento().getCodigo()==null){
			if(!CollectionUtils.isEmpty(departamentoList)){
				Departamento departamentoTemp = departamentoList.get(0);
				declaracionForm.getActividad().setDepartamento(departamentoTemp);
			}
		}
		if(declaracionForm.getActividad().getDepartamento()!=null && declaracionForm.getActividad().getDepartamento().getCodigo()!=null){
			tipoDataBase = tipoDataBaseService.getTipoDataBaseById(declaracionForm.getActividad().getDepartamento().getCodigo());
			List<Provincia> provinciaList = tipoDataBaseService.getProvinciaListByCodigoPadre(tipoDataBase.getCodigo());
			declaracionForm.getActividad().setProvinciaList(provinciaList);
			if(!CollectionUtils.isEmpty(provinciaList) && (declaracionForm.getActividad().getProvincia()==null || declaracionForm.getActividad().getProvincia().getCodigo()==null)){
				Provincia provinciaTemp = provinciaList.get(0);
				declaracionForm.getActividad().setProvincia(provinciaTemp);
			}
		}else{
			declaracionForm.getActividad().setProvincia(new Provincia());
			declaracionForm.getActividad().setProvinciaList(new ArrayList<Provincia>());
		}
		if(declaracionForm.getActividad().getProvincia()!=null && declaracionForm.getActividad().getProvincia().getCodigo()!=null){
			tipoDataBase = tipoDataBaseService.getTipoDataBaseById(declaracionForm.getActividad().getProvincia().getCodigo());
			List<Distrito> distritoList = tipoDataBaseService.getDistritoListByCodigoPadre(tipoDataBase.getCodigo());
			declaracionForm.getActividad().setDistritoList(distritoList);
			if(!CollectionUtils.isEmpty(distritoList) && (declaracionForm.getActividad().getDistrito()==null || declaracionForm.getActividad().getDistrito().getCodigo()==null)){
				Distrito distritoTemp = distritoList.get(0);
				declaracionForm.getActividad().setDistrito(distritoTemp);
			}
		}else{
			declaracionForm.getActividad().setDistrito(new Distrito());
			declaracionForm.getActividad().setDistritoList(new ArrayList<Distrito>());
		}

			
		/*donacion*/
		declaracionForm.getDonacion().setMonedaList(tipoDataBaseService.getMonedaList());		
		declaracionForm.getDonacion().setPaisList(tipoDataBaseService.getPaisList());
		declaracionForm.getDonacion().setEstadoDonacionList(tipoDataBaseService.getEstadoDonacionList());
		List<Resolucion> resolucionList = null;
		if(declaracionForm.getArrResolucion()!=null)
			resolucionList = Arrays.asList(declaracionForm.getArrResolucion());
		
		if(CollectionUtils.isEmpty(resolucionList)){
			resolucionList = new ArrayList<Resolucion>();
			resolucionList.add(new Resolucion());
			resolucionList.add(new Resolucion());
			declaracionForm.setArrResolucion(resolucionList.toArray(new Resolucion[0]));
		}
		List<Empresa> empresaList = null;
		if(declaracionForm.getArrEmpresa()!=null)
			empresaList = Arrays.asList(declaracionForm.getArrEmpresa());
		
		if(CollectionUtils.isEmpty(empresaList)){
			empresaList = new ArrayList<Empresa>();
			empresaList.add(new Empresa());
			empresaList.add(new Empresa());
			declaracionForm.setArrEmpresa(empresaList.toArray(new Empresa[0]));
		}
		logger.info(declaracionForm.getDonacion().getFechaRecepcion());
		/*Observacion*/
		
		
		referenceData.put("declaracionForm", declaracionForm);
		return referenceData;
	}
	
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), false));
	}
	
	public void setTipoDataBaseService(TipoDataBaseService tipoDataBaseService) {
		this.tipoDataBaseService = tipoDataBaseService;
	}

	public void setResolucionService(ResolucionService resolucionService) {
		this.resolucionService = resolucionService;
	}

	public void setDeclaracionService(DeclaracionService declaracionService) {
		this.declaracionService = declaracionService;
	}

	public void setEmpleadoService(EmpleadoService empleadoService) {
		this.empleadoService = empleadoService;
	}

	public void setEntidadDireccionService(
			EntidadDireccionService entidadDireccionService) {
		this.entidadDireccionService = entidadDireccionService;
	}

	public void setDonacionService(DonacionService donacionService) {
		this.donacionService = donacionService;
	}

	public void setEmpresaService(EmpresaService empresaService) {
		this.empresaService = empresaService;
	}

	public void setActividadService(ActividadService actividadService) {
		this.actividadService = actividadService;
	}

}
